<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>

<script>

// Create an image with invalid data.
var invalidImage = new Image();
invalidImage.src = 'resources/shadow-offset.js';

var ctx = document.createElement("canvas").getContext('2d');
function draw() {
    // null and undefined images should throw TypeError
    assert_throws_js(TypeError, function() {
      ctx.drawImage(null, 0, 0);
    });
    assert_throws_js(TypeError, function() {
      ctx.drawImage(null, 0, 0, 20, 20);
    });
    assert_throws_js(TypeError, function() {
      ctx.drawImage(null, 0, 0, 20, 20, 0, 0, 20, 20);
    });
    assert_throws_js(TypeError, function() {
      ctx.drawImage(undefined, 0, 0);
    });
    assert_throws_js(TypeError, function() {
      ctx.drawImage(undefined, 0, 0, 20, 20);
    });
    assert_throws_js(TypeError, function() {
      ctx.drawImage(undefined, 0, 0, 20, 20, 0, 0, 20, 20);
    });

    // broken images should throw InvalidStateError
    assert_throws_dom("INVALID_STATE_ERR", function() {
      ctx.drawImage(invalidImage, 0, 0);
    });
    assert_throws_dom("INVALID_STATE_ERR", function() {
      ctx.drawImage(invalidImage, 0, 0, 20, 20);
    });
    assert_throws_dom("INVALID_STATE_ERR", function() {
      ctx.drawImage(invalidImage, 0, 0, 20, 20, 0, 0, 20, 20);
    });
    assert_throws_dom("INVALID_STATE_ERR", function() {
      ctx.drawImage(invalidImage, 0, 0, 0, 20);
    });
    assert_throws_dom("INVALID_STATE_ERR", function() {
      ctx.drawImage(invalidImage, 0, 0, 0, 20, 0, 0, 20, 20);
    });
}

async_test(t => {
        invalidImage.onerror = function() {
            t.step(draw);
            t.done();
        }
}, "This test checks behavior of Canvas::drawImage with a broken source image.");
</script>
</body>
</html>
